# autograd 自动微分
import torch

'''
torch.Tensor 是包的核心类。如果将其属性 .requires_grad 设置为 True，
则会开始跟踪针对 tensor 的所有操作。完成计算后，您可以调用 .backward() 来自动计算所有梯度。
该张量的梯度将累积到 .grad 属性中。
'''

x=torch.ones(2,2,requires_grad=True)
#print('x',x)
'''
结果展示：
x tensor([[1., 1.],
        [1., 1.]], requires_grad=True)
'''

y=x+2    # 矩阵每一个元素都加上2
#print('y',y,'y.grad_fn',y.grad_fn)
'''
结果展示：
y tensor([[3., 3.],
        [3., 3.]], grad_fn=<AddBackward0>) y.grad_fn <AddBackward0 object at 0x000001D3F4F15F28>
'''

z=y*y*3
z_out=z.mean()
#print('z_out',z_out)
# 结果展示：z_out tensor(27., grad_fn=<MeanBackward0>)

print('x.backward',x.backward(z))    # x.backward None